﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using LASMobile.Classes;
using LASMobile.LASDBClasses;

namespace LASMobile
{
    public partial class PedidosDocumento : Page
    {
        private readonly LASDBDataContext _db = new LASDBDataContext();
        private int _companyId = 1;
        private Usuario _usuario;
        private List<Socio> _clientes = new List<Socio>();
        private List<Moneda> _monedas = new List<Moneda>();

        #region Structs
        public struct StructDocumento
        {
            public DateTime FechaContabilizacion { get; set; }
            public DateTime FechaEntrega { get; set; }
            public Socio Cliente { get; set; }
            public Moneda Moneda { get; set; }
            public List<StructProducto> ListaDeProductos { get; set; }
        }
        
        public struct StructProducto
        {
            public Bodega Bodega { get; set; }
            public Articulo Artículo { get; set; }
            public int Cantidad { get; set; }
            public Decimal Precio { get; set; }
            public int Impuesto { get; set; }
        }
        #endregion

        private void LoadProducts(List<StructProducto> lista)
        {
            foreach (var structProducto in lista)
            {
                ProductosListBox.Items.Add("Código: " + structProducto.Artículo.CodigoUnico);
                ProductosListBox.Items.Add("Bodega: " + structProducto.Bodega.NombreBodega);
                ProductosListBox.Items.Add("Cantidad: " + structProducto.Cantidad);
                ProductosListBox.Items.Add("Precio: " + structProducto.Precio);
                ProductosListBox.Items.Add("Impuesto :" + structProducto.Impuesto);
                ProductosListBox.Items.Add("");
            }

            Decimal totalAntesImpuesto = 0;
            Decimal impuestos = 0;

            foreach (var art in lista)
            {
                totalAntesImpuesto = +(art.Cantidad * art.Precio);
                impuestos = +(art.Cantidad * art.Precio * art.Impuesto/100);
            }

            ProductosListBox.Items.Add("Total antes de impuestos: " + ((totalAntesImpuesto*100)/100));
            ProductosListBox.Items.Add("Impuestos:" + ((impuestos*100)/100));
            ProductosListBox.Items.Add("Total:" + (totalAntesImpuesto + impuestos));
        }

        #region Eventos del GUI
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session[Constants.SESSION_USER] != null)
            {
                _usuario = (Usuario)Session[Constants.SESSION_USER];
                _companyId = _usuario.Empresa.IdEmpresa;
            }
            else
            {
                Response.Redirect("Default.aspx", true);
            }

            _clientes = LoadClientesSistema();
            _monedas = LoadSystemCurrencies();


            if (Session[Constants.SESSION_SALE] != null && ((StructDocumento)Session[Constants.SESSION_SALE]).Cliente != null && ((StructDocumento)Session[Constants.SESSION_SALE]).Moneda!=null)
            {
                var documento = (StructDocumento)Session[Constants.SESSION_SALE];

                ContabilizacionFecha_CalendarExtender.SelectedDate = documento.FechaContabilizacion;
                EntregaFecha_CalendarExtender.SelectedDate = documento.FechaEntrega;

                ClienteDropDownList.SelectedIndex =
                    _clientes.FindIndex(cliente => cliente.IdSocio == documento.Cliente.IdSocio);

                MonedaDropDownList.SelectedIndex =
                    _monedas.FindIndex(moneda => moneda.IdMoneda == documento.Moneda.IdMoneda); 

                if(documento.ListaDeProductos!=null)
                {
                    LoadProducts(documento.ListaDeProductos);
                }

            }
            else if (ClienteDropDownList.SelectedIndex >= 0 && MonedaDropDownList.SelectedIndex >= 0)
            {
                var pedido = new StructDocumento();

                if (Session[Constants.SESSION_SALE] != null)
                {
                    pedido.ListaDeProductos = ((StructDocumento)Session[Constants.SESSION_SALE]).ListaDeProductos;
                }

                pedido.Cliente = _clientes[ClienteDropDownList.SelectedIndex];
                pedido.Moneda = _monedas[MonedaDropDownList.SelectedIndex];

                var date = ContabilizacionFecha.Text;
                var dateArray = date.Split('/');

                if (dateArray.Length==3)
                {
                    pedido.FechaContabilizacion = new DateTime(int.Parse(dateArray[2]), int.Parse(dateArray[0]), int.Parse(dateArray[1]));
                }

                date = EntregaFecha.Text;
                dateArray = date.Split('/');

                if (dateArray.Length == 3)
                {
                    pedido.FechaEntrega = new DateTime(int.Parse(dateArray[2]), int.Parse(dateArray[0]), int.Parse(dateArray[1]));
                }

                Session[Constants.SESSION_SALE] = pedido;
            }

                ClienteDropDownList.DataSource = _clientes.Select(cliente => cliente.Nombre);
                MonedaDropDownList.DataSource = _monedas.Select(moneda => moneda.NombreMoneda);
                ClienteDropDownList.DataBind();
                MonedaDropDownList.DataBind();
        }

        protected void CloseSession(object sender, EventArgs e)
        {
            Session[Constants.SESSION_USER] = null;
            Session[Constants.SESSION_SALE] = null;
            Response.Redirect("Default.aspx", true);
        }

        protected void AgregarArticulo(object sender, EventArgs e)
        {
            
            Response.Redirect("Pedidos.aspx", true);
        }
        #endregion

        #region Métodos LINQ-TO-SQL
        /// <summary>
        /// Metodo que permite obtener la lista de proveedores
        /// </summary>
        /// <returns></returns>
        private List<Socio> LoadClientesSistema()
        {
            List<Socio> result = null;

            try
            {
                var queryResult = from socio in _db.Socios
                                  where socio.TipoSocio.TipoSocio1.Contains("Cliente")
                                  select socio;
                result = queryResult.ToList();
            }
            catch (Exception)
            {
                return result;
            }
            return result;
        }


        private List<Moneda> LoadSystemCurrencies()
        {
            List<Moneda> result = null;

            try
            {
                var queryResult = from moneda in _db.Monedas
                                  select moneda;
                result = queryResult.ToList();
            }
            catch (Exception)
            {
                return result;
            }
            return result;
        }
        #endregion

        /// <summary>
        /// Metodo que permite crear una orden de compra sin documentos previos
        /// </summary>
        /// <param name="listaProductos">Lista de productos por añadir</param>
        public void CreateOV(StructDocumento doc)
        {
            if (doc.ListaDeProductos.Count == 0) return;

            Decimal totalAntesImpuesto = 0;
            Decimal impuestos = 0;

            foreach (var art in doc.ListaDeProductos)
            {
                totalAntesImpuesto += +(art.Cantidad * art.Precio);
                impuestos += +(art.Cantidad * art.Precio * art.Impuesto / 100);
            }
            
            // ingresa el documento de OV
            _db.InsertDocumentOV(doc.Cliente.IdSocio, _companyId,
                                 doc.Moneda.IdMoneda, doc.FechaContabilizacion, doc.FechaEntrega,
                                 totalAntesImpuesto, impuestos);

            // se ingresan los productos correspondientes
            foreach (var producto in doc.ListaDeProductos)
            {
                _db.InsertDocumentProductSales(producto.Artículo.IdArticulo, producto.Bodega.IdBodega, producto.Cantidad,
                                          producto.Precio, producto.Impuesto);
            }


        }


        protected void RealizarPedido(object sender, EventArgs e)
        {
            if (Session[Constants.SESSION_SALE] != null)
            {
                var doc = (StructDocumento) Session[Constants.SESSION_SALE];

                if (doc.ListaDeProductos.Count == 0||doc.Moneda==null||doc.Cliente==null) return;

                try
                {
                    CreateOV(doc);

                    Response.Redirect("Menu.aspx", true);
                }
                catch
                {
                    
                }

                

            }
        }
    }
}